
var data = [
    { pid: 0, id: 'a', value: '陕西' },
    { pid: 'a', id: 01, value: '西安' },
    { pid: 01, id: 301, value: '雁塔区' },
    { pid: 01, id: 302, value: '高新区' },
    { pid: 'a', id: 02, value: '渭南' },
    { pid: 'a', id: 03, value: '咸阳' },
    { pid: 0, id: 'b', value: '广东' },
    { pid: 'b', id: 11, value: '广州' },
    { pid: 'b', id: 12, value: '深圳' },
    { pid: 'b', id: 13, value: '潮汕' },
    { pid: 0, id: 'c', value: '湖南' },
    { pid: 'c', id: 21, value: '长沙' },
    { pid: 'c', id: 22, value: '常德' },
    { pid: 'c', id: 23, value: '岳阳' },
];

/**
 * @description: 返回树形数据
 * @param {*传入数组} data
 * @return {*}
 * @author: CHY
 */
function toTree(data) {
    let cloneData = JSON.parse(JSON.stringify(data))    // 对源数据深度克隆
    let tree = cloneData.filter((father) => {              //循环所有项
        let branchArr = cloneData.filter((child) => {
            return father.id == child.pid;//返回每一项的子级数组
        });
        if (branchArr.length > 0) {
            father.children = branchArr; //如果存在子级，则给父级添加一个children属性，并赋值
        }
        return father.pid == 0;//返回第一层
    });
    return tree;    //返回树形数据
}
var tree = toTree(data);
console.log(tree);

//#region 
//数据扁平化
var data = [
    {
        id: "a", pid: 0, value: "陕西", children: [
            { id: 01, pid: "a", value: "西安" },
            { id: 02, pid: "a", value: "渭南" },
            { id: 03, pid: "a", value: "咸阳" },
        ]
    },
    {
        id: "b", pid: 0, value: "广东", children: [
            { id: 11, pid: "b", value: "广州" },
            { id: 12, pid: "b", value: "深圳" },
            { id: 13, pid: "b", value: "潮汕" },
        ]
    },
    {
        id: "c", pid: 0, value: "湖南", children: [
            { id: 21, pid: "c", value: "长沙" },
            { id: 22, pid: "c", value: "常德" },
            { id: 23, pid: "c", value: "岳阳" },
        ]
    },
];

//方法1
/*   function toLine(data) {
      return data.reduce((arr, { id, value, pid, children = [] }) =>
          arr.concat([{ id, value, pid }], toLine(children)), [])
      return result;
  }
*/

/**
 * @description: 数据扁平化，方法2
 * @param {*传一个数组来扁平化} data
 * @return {* 返回扁平化后的数组}
 * @author: CHY
 */
function toLine(data) {
    let arr = []
    let arr2 = []
    let list = {}
    data.forEach(item => {
        for (let k in item) {
            if (k !== 'children') {
                list[k] = item[k]
            }
            if (k === 'children') {
                arr = item[k]
            }
            // console.log(k);
        }
        arr2.push(list)
        arr2 = [...arr2, ...arr]
        list = {}
        arr = []
    });
    return arr2
}

var listarr = toLine(data);
console.log(listarr);

//#endregion
